home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 November / CHIP Kasım 1996.iso / ms / webpost / wpsdk.exe / RCDATA / CABINET / WBPROV.CPP < prev    next >
C/C++ Source or Header  |  1996-05-15  |  5KB  |  272 lines

  1. /*****************************************************************/
  2. /**               Microsoft Windows 4.00                        **/
  3. /**           Copyright (C) Microsoft Corp., 1995-1996          **/
  4. /*****************************************************************/
  5.  
  6. /* WPTEST.CPP - Test provider with COM interface
  7.  *
  8.  */
  9.  
  10. #include "wbprov.h"
  11.  
  12. #pragma data_seg(DATASEG_PERINSTANCE)
  13.  
  14. HANDLE g_hmtxShell = 0;              // Note: Handle is per-instance.
  15.  
  16. #ifdef DEBUG
  17. BOOL g_fCritical=FALSE;
  18. #endif
  19.  
  20. extern "C" HANDLE g_hInstance = NULL;
  21. #pragma data_seg(DATASEG_DEFAULT)
  22.  
  23. const char szMutexName[] = "WPtestProviderMutex";
  24.  
  25. UINT g_cRefThisDll = 0;     // Reference count of this DLL.
  26. UINT g_cLocks = 0;          // Number of locks on this server.
  27.  
  28. //
  29. // Shared Global data (32-bit only)
  30. //
  31. BOOL g_cProcesses = 0;
  32.  
  33.  
  34. void LockThisDLL(BOOL fLock)
  35. {
  36.     ENTERCRITICAL
  37.     {
  38.         if (fLock)
  39.             g_cLocks++;
  40.         else
  41.             g_cLocks--;
  42.     }
  43.     LEAVECRITICAL
  44. }
  45.  
  46.  
  47. void RefThisDLL(BOOL fRef)
  48. {
  49.     ENTERCRITICAL
  50.     {
  51.         if (fRef)
  52.             g_cRefThisDll++;
  53.         else
  54.             g_cRefThisDll--;
  55.     }
  56.     LEAVECRITICAL
  57. }
  58.  
  59.  
  60. void Netlib_EnterCriticalSection(void)
  61. {
  62.     WaitForSingleObject(g_hmtxShell, INFINITE);
  63. #ifdef DEBUG
  64.     g_fCritical=TRUE;
  65. #endif
  66. }
  67.  
  68. void Netlib_LeaveCriticalSection(void)
  69. {
  70. #ifdef DEBUG
  71.     g_fCritical=FALSE;
  72. #endif
  73.     ReleaseMutex(g_hmtxShell);
  74. }
  75.  
  76. //
  77. // Initializes shared data (16-bit/32-bit common: once per DLL)
  78. //
  79. BOOL WINAPI _Initialize_SharedData(void)
  80. {
  81.     return TRUE;
  82. }
  83.  
  84. //
  85. // Clean up shared data (16-bit/32-bit common : once per-DLL)
  86. //
  87. BOOL WINAPI _Terminate_SharedData(void)
  88. {
  89.     return TRUE;
  90. }
  91.  
  92.  
  93. BOOL _ProcessAttach(HINSTANCE hDll)
  94. {
  95.     BOOL fSuccess = TRUE;
  96.  
  97.     //
  98.     // All the per-instance initialization code should come here.
  99.     //
  100.     //
  101.     g_hmtxShell = CreateMutex(NULL, FALSE, ::szMutexName);  // per-instance
  102.  
  103.     ::g_hInstance = hDll;
  104.  
  105.     ENTERCRITICAL
  106.     {
  107.         if (g_cProcesses++==0)
  108.         {
  109.             fSuccess = _Initialize_SharedData();
  110.         }
  111.     }
  112.     LEAVECRITICAL
  113.  
  114.     return fSuccess;
  115. }
  116.  
  117. BOOL _ProcessDetach(HINSTANCE hDll) // 32-bit
  118. {
  119.  
  120.     BOOL fSuccess = TRUE;
  121.  
  122.     ENTERCRITICAL
  123.     {
  124.         if (--g_cProcesses==0)
  125.         {
  126.             fSuccess=_Terminate_SharedData();
  127.         }
  128.     }
  129.     LEAVECRITICAL
  130.  
  131.     CloseHandle(g_hmtxShell);
  132.  
  133.     return fSuccess;
  134. }
  135.  
  136.  
  137. //
  138. // Class factory object
  139. //
  140. //
  141.  
  142. STDMETHODIMP WPPClassFactory::QueryInterface(
  143.     /* [in] */ REFIID riid,
  144.     /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
  145. {
  146.     *ppvObject = NULL;
  147.  
  148.     if (IsEqualIID(riid, IID_IUnknown) ||
  149.         IsEqualIID(riid, IID_IClassFactory)) {
  150.         *ppvObject = (LPVOID)this;
  151.         AddRef();
  152.         return NOERROR;
  153.     }
  154.     return ResultFromScode(E_NOINTERFACE);
  155. }
  156.  
  157.  
  158. STDMETHODIMP_(ULONG) WPPClassFactory::AddRef(void)
  159. {
  160.     RefThisDLL(TRUE);
  161.  
  162.     return 1;
  163. }
  164.  
  165.  
  166. STDMETHODIMP_(ULONG) WPPClassFactory::Release(void)
  167. {
  168.     RefThisDLL(FALSE);
  169.  
  170.     return 1;
  171. }
  172.  
  173.  
  174. HRESULT CreateProvider(REFIID riid, void **ppOut)
  175. {
  176.     return ResultFromScode(E_NOTIMPL);
  177. }
  178.  
  179.  
  180. STDMETHODIMP WPPClassFactory::CreateInstance(
  181.     /* [unique][in] */ IUnknown __RPC_FAR *pUnkOuter,
  182.     /* [in] */ REFIID riid,
  183.     /* [out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
  184. {
  185.     if (NULL != pUnkOuter)
  186.         return ResultFromScode(CLASS_E_NOAGGREGATION);
  187.  
  188.     return CreateProvider (riid, ppvObject);
  189. }
  190.  
  191.  
  192. STDMETHODIMP WPPClassFactory::LockServer(
  193.     /* [in] */ BOOL fLock)
  194. {
  195.     LockThisDLL(fLock);
  196.  
  197.     return NOERROR;
  198. }
  199.  
  200.  
  201. //
  202. // Following are standard global functions, needed for DLL initialization
  203. // and OLE infrastructure support. THey are exported by name , thus should be declared
  204. // as undecorated
  205. //
  206.  
  207. extern "C" {
  208.  
  209. BOOL
  210. _stdcall
  211. DllEntryPoint(
  212.     HINSTANCE hInstDll,
  213.     DWORD fdwReason,
  214.     LPVOID reserved)
  215. {
  216.     if (fdwReason == DLL_PROCESS_ATTACH)
  217.         return _ProcessAttach(hInstDll);
  218.     else if (fdwReason == DLL_PROCESS_DETACH) {
  219.         return _ProcessDetach(hInstDll);
  220.     }
  221.  
  222.     g_hInstance = hInstDll;
  223.  
  224.     return TRUE;
  225. }
  226.  
  227. BOOL
  228. _stdcall
  229. DllMain(
  230.     HINSTANCE hInstDll,
  231.     DWORD fdwReason,
  232.     LPVOID reserved)
  233. {
  234.     return DllEntryPoint(hInstDll,fdwReason,reserved);
  235. }
  236.  
  237. STDAPI DllCanUnloadNow(void)
  238. {
  239.     SCODE sc;
  240.  
  241.     sc = (0 == g_cRefThisDll && 0 == g_cLocks) ? S_OK : S_FALSE;
  242.     return ResultFromScode(sc);
  243. }
  244.  
  245.  
  246. STDAPI DllGetClassObject(
  247.     REFCLSID rclsid,
  248.     REFIID riid,
  249.     LPVOID FAR *ppv)
  250. {
  251.     if (!IsEqualCLSID(rclsid, CLSID_WPProvider)) {
  252.         return ResultFromScode(E_FAIL);
  253.     }
  254.  
  255.     if (!IsEqualIID(riid, IID_IUnknown) &&
  256.         !IsEqualIID(riid, IID_IClassFactory)) {
  257.         return ResultFromScode(E_NOINTERFACE);
  258.     }
  259.  
  260.     static WPPClassFactory cf;
  261.  
  262.     *ppv = (LPVOID)&cf;
  263.  
  264.     cf.AddRef();
  265.  
  266.     return NOERROR;
  267. }
  268.  
  269. };  /* extern "C" */
  270.  
  271.  
  272.